/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package services;

import domain.Ativo;
import java.text.ParseException;
import util.crudService.CrudService;
import util.Util;
import java.io.FileNotFoundException;
import java.io.IOException;
import com.csvreader.CsvReader;
import java.io.File;
import java.io.FileFilter;
import java.sql.Date;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author guerrero
 */
public class Service {

    private CrudService crudService;
    private List<Ativo> ativos = null;

    public Service() {
        crudService = new CrudService();
    }

    public void criarAtivo(Ativo a) {
        crudService.create(a);
    }

    public Ativo getAtivo(long id) {
        return crudService.find(Ativo.class, id);
    }

    public void carregarAtivos() throws ParseException {

        List<String> arquivos = listarArquivos();

        for (String arquivo : arquivos) {

            try {

                CsvReader registros = new CsvReader(arquivo);
                registros.readHeaders();

                // obtem o codigo do arquivo, ex:  GGBR4
                String codigo = extrairCodigo(arquivo);
                ativos = new ArrayList<Ativo>();
                int size = 0;

                while (registros.readRecord()) {
                    size++;
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                    Date data = new java.sql.Date(format.parse(registros.get("Date")).getTime());

                    float abertura = Float.parseFloat(registros.get("Open"));
                    float alta = Float.parseFloat(registros.get("High"));
                    float baixa = Float.parseFloat(registros.get("Low"));
                    float fechamento = Float.parseFloat(registros.get("Close"));
                    long volume = Long.parseLong(registros.get("Volume"));
                    float ajustado = Float.parseFloat(registros.get("Adj Close"));

                    Ativo a = new Ativo(codigo, data, abertura, alta, baixa, fechamento, ajustado, volume);
                    ativos.add(a);
                }
                this.crudService.create(ativos);
                registros.close();

            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    }

    public List<String> listarArquivos() {
        List listaArquivos = new ArrayList();
        File f = new File(Util.getDiretorioDados()); //-- O diretório
        //-- Lista de arquivos .csv
        File[] files = f.listFiles(new FileFilter() {

            public boolean accept(File pathname) {
                return pathname.getName().toLowerCase().endsWith(Util.getExtensaoArquivos());
            }
        });

        for (int i = 0; i < files.length; ++i) {
            listaArquivos.add(files[i].toString());
        }
        return listaArquivos;
    }

    private String extrairCodigo(String arquivo) {
        return arquivo.substring(arquivo.length() - 9, arquivo.length() - 4);
    }

    private void calcularMediasMoveis(int tamanho) {
        int i = tamanho - 1;
        Ativo a = null;
        float pToday;
        float k20 = 2 / (20 + 1);
        float k50 = 2 / (50 + 1);
        float k200 = 2 / (200 + 1);
        float sma20 = 0;
        float sma50 = 0;
        float sma200 = 0;
        float ema20 = 0;
        float ema50 = 0;
        float ema200 = 0;
        float emaYesterday20 = 0;
        float emaYesterday50 = 0;
        float emaYesterday200 = 0;


        while (i > 0) {
            a = ativos.get(i - 1);

            if ((tamanho - i) > 200) {
                ema200 = a.getFechamento() * k200 + emaYesterday200 * (1 - k200);
                ema50 = a.getFechamento() * k50 + emaYesterday50 * (1 - k50);
                ema20 = a.getFechamento() * k20 + emaYesterday50 * (1 - k20);
            } else if ((tamanho - i) > 50) {
                ema50 = a.getFechamento() * k50 + emaYesterday50 * (1 - k50);
                ema20 = a.getFechamento() * k20 + emaYesterday50 * (1 - k20);
            } else if ((tamanho - i) > 20) {
                ema20 = a.getFechamento() * k20 + emaYesterday50 * (1 - k20);
            } else {
                ;
            }

            i--;

        }
    }
}
